package QianFeng03;

/**封装性
 * 概念：就是隐藏实现细节，仅对外提供访问接口
 * 封装有：属性的封装、方法的封装、类的封装、组件的封装、模块化的封装、系统级封装.......
 * 好处：模块化、信息隐藏、代码重用、插件容易调试和具有安全性（最重要）
 * 缺点：会影响执行效率
 * 了解private关键字：访问权限修饰符，表示私有的，私有的方法和属性只能在本类中访问。想要在类外部访问，需要提供公有的方法来间接访问
 * 通常在一个类中，属性都私有化，并对外提供getter and setter方法
 */
public class Test2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //属性没有封装，那么在本类之外创建对象后，可以直接访问属性
        Person p1 = new Person();
        //p1.name ="周欣";//私有的就不能直接调用
        //p1.age =18;//私有的就不能直接调用
        p1.setName("周欣");
        p1.setAge(18);
        p1.run(5);
    }

}
/**成员变量和局部变量
 * 在类中的位置不同：成员变量在类中定义，局部变量在方法中定义或方法的参数
 * 在内存中的位置不同：成员变量在堆内存（成员变量属于对象，对象进堆内存） 局部变量在栈内存（局部变量属于方法，方法进栈内存）
 * 生命周期不同：成员变量随着对象的创建而存在，随着对象的销毁而消失。局部变量随着方法的调用而存在，随着方法的调用完毕而消失
 * 初始化不同：成员变量有默认的初始化，引用类型默认为null。 局部变量没有默认初始化，必须定义、赋值，然后才能使用
 * 注意：局部变量名称可以和成员变量一样，在方法中使用的时候，采用的是就近原则
 */
class Person {
    //属性的封装
    private String name;//成员变量，在类中定义
    private int age;//成员变量，在类中定义

    //getter and setter 的方法
    //对外提供一个获取name属性的方法
    public String getName() {
        return name;
    }
    //对外提供一个为name属性设值的方法
    public void setName(String name) {//局部变量，在方法中定义或方法的参数
        this.name = name;
    }
    //对外提供一个获取age属性的方法
    public int getAge() {
        return age;
    }
    //对外提供一个为age属性设值的方法
    public void setAge(int age) {
        this.age = age;
    }

    public void run(int len) {//参数也是局部变量
        int m = len; //m也是局部变量
        System.out.println("我跑了"+m+"米");
    }


}
